/**
 * @Author 赵光
 * @Desc BaseAspect
 * @Date 2020年5月18日
 */
package com.xiaouyudeguang.common.aspect;

import com.xiaouyudeguang.common.utils.MethodUtils;
import com.xiaouyudeguang.common.utils.RandomUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Method;

/**
 * <p>
 * 顶级切面父类
 * </p>
 *
 * @author 赵光
 * @since 2020年5月18日
 */
public abstract class AopAspect {

    protected Logger log = LoggerFactory.getLogger(this.getClass());

    /**
     * 请求id
     */
    protected String requestId;

    /**
     * 被切面真实类
     */
    protected Class<?> realClass;

    /**
     * 被切面方法
     */
    protected Method realMethod;

    /**
     * 请求参数
     */
    protected Object[] args;

    /**
     * 返回类型
     */
    protected Class<?> returnType;

    /**
     * 开始时间
     */
    protected long startTime;

    /**
     * 初始化切面上下文
     *
     * @param pjp
     */
    protected void initAspect(ProceedingJoinPoint pjp) {
        Signature signature = pjp.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method targetMethod = methodSignature.getMethod();
        this.realClass = targetMethod.getDeclaringClass();
        this.realMethod = MethodUtils.getRealMethod(realClass, targetMethod);
        this.returnType = realMethod.getReturnType();
        this.startTime = System.currentTimeMillis();
        this.requestId = RandomUtils.randomId();
        this.args = pjp.getArgs();
    }

}
